home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 286_01 / font.c < prev    next >
Text File  |  1989-05-23  |  4KB  |  171 lines

  1. #include <stdio.h>
  2. #include <gds.h>
  3. #include <prtfont.h>
  4. #include <fcntl.h>
  5. #include <io.h>
  6.  
  7. #define ERROR (-1)
  8. #define OK 0
  9.  
  10. getfontn()
  11. {
  12.     register int loop;
  13.  
  14.     for (loop=1; loop < MAXNFONT ; loop++) {
  15.         if (FONTTAB[loop].status==NOT_USED) {
  16.             FONTTAB[loop].status=USED;
  17.             return(loop);
  18.         }
  19.     }
  20.     return(ERROR);
  21. }
  22.  
  23. LoadFont(fontfilename)
  24. char *fontfilename;
  25. {
  26.     int fp,fontn, count, loop;
  27.     char hbuf[16];
  28.  
  29.     if ((fontn=getfontn()) == ERROR) {
  30.         graderror(4,13);
  31.     }
  32.     if ((fp=open(fontfilename,O_RDONLY | O_BINARY)) == ERROR) {
  33.         graderror(2,6,fontfilename);
  34.         FONTTAB[fontn].status=NOT_USED;
  35.         return(0);
  36.         }
  37.     if ((count=read(fp,CFBUF,256)) <= 0) {
  38. errorexit:
  39.         graderror(4,14);
  40.     }
  41.     if (CFBUF[0]!=51) goto errorexit;
  42.     for (loop=1; loop<=count; loop++) {
  43.         if (CFBUF[loop]==0) goto cont;
  44.     }
  45.     goto errorexit;
  46. cont:
  47.     loop++;
  48.     lseek(fp,(long) loop, SEEK_SET);
  49.     loop+=16;
  50.     if (read(fp,hbuf,16) != 16)
  51.         goto errorexit;
  52.     close(fp);
  53.     FONTTAB[fontn].type=hbuf[0];
  54.     switch(hbuf[0]) {
  55.     case 0:
  56.         readfont0(fontfilename,fontn,hbuf,loop);
  57.         break;
  58.     case 1:
  59.         readfont1(fontfilename,fontn,hbuf,loop);
  60.         break;
  61.     default:
  62.         goto errorexit;
  63.     }
  64.     return(fontn);
  65. }
  66.  
  67. readfont0(fontfilename,fontn,hbuf,pos)
  68. int fontn, pos;
  69. char hbuf[], *fontfilename;
  70. {
  71.     struct fontspec huge *tptr;
  72.     register struct FONTABLE *ptr;
  73.     unsigned int nuchar;
  74.     long temp;
  75.     int fn;
  76.  
  77.     char huge *halloc();
  78.  
  79.     ptr=&FONTTAB[fontn];
  80.     ptr->start = hbuf[3] + (hbuf[4] << 8);
  81.     tptr=
  82.       ptr->chinfo=(struct fontspec huge *) halloc(1L,sizeof(struct fontspec));
  83.     nuchar=hbuf[1]+(hbuf[2]<<8);
  84.     ptr->lastchar=ptr->start - 1 + nuchar;
  85.     ptr->direction=0;
  86.     ptr->defch = hbuf[11];
  87.     temp=((long) (hbuf[6]+7)>>3) * hbuf[7] * nuchar;
  88.     if ((ptr->fontaddr=
  89.              (char huge *) nor_ptr((int far *) halloc(temp,1))) ==
  90.                    (char huge *) NULL) {
  91.         graderror(4,15);
  92.     }
  93.     fn=dosopen(fontfilename);
  94.     dosseek(fn,pos);
  95.     if (dosread(fn,ptr->fontaddr,temp) != temp) {
  96.         graderror(4,14);
  97.     }
  98.     dosclose(fn);
  99.     tptr->width = hbuf[5];
  100.     tptr->inkwidth = hbuf[6];
  101.     tptr->height = hbuf[7];
  102.     tptr->leftmargin = hbuf[8];
  103.     tptr->topline = hbuf[9];
  104.     tptr->cellheight = hbuf[10];
  105. }
  106.  
  107. readfont1(fontfilename,fontn,hbuf,pos)
  108. int fontn, pos;
  109. char *fontfilename,hbuf[];
  110. {
  111.     struct fontspec huge *tptr;
  112.     register struct FONTABLE *ptr;
  113.     int nuchar, loop, fn;
  114.     long temp,temp2;
  115.     long huge *szptr;
  116.  
  117.     char huge *halloc();
  118.  
  119.     ptr=&FONTTAB[fontn];
  120.     ptr->start=hbuf[3]+(hbuf[4]<<8);
  121.     nuchar=hbuf[1]+(hbuf[2]<<8);
  122.     ptr->lastchar=ptr->start - 1 + nuchar;
  123.     ptr->direction=0;
  124.     ptr->defch=hbuf[8];
  125.     if ((ptr->szinfo=(long huge *) halloc((long) nuchar,sizeof(long)))
  126.                      == (long *) NULL) {
  127.         graderror(4,15);
  128.     }
  129.     if ((tptr=ptr->chinfo=
  130.          (struct fontspec huge *)halloc((long) nuchar,sizeof(struct fontspec)))
  131.                 == (struct fontspec *) NULL) {
  132.         graderror(4,15);
  133.     }
  134.     fn=dosopen(fontfilename);
  135.     if (dosseek(fn,pos)==(-1)) graderror(4,21);
  136.     temp2=(long) nuchar*sizeof(struct fontspec);
  137.     if (dosread(fn,(char huge *) ptr->chinfo,temp2)
  138.             != temp2) {
  139.         graderror(4,14);
  140.     }
  141.     temp=0L;
  142.     szptr=ptr->szinfo;
  143.     for (loop=0; loop<nuchar; loop++) {
  144.         *szptr++=temp;
  145.         temp+=(long) (((tptr->inkwidth + 7) >> 3) * tptr->height);
  146.         tptr++;
  147.     }
  148.     if ((ptr->fontaddr=halloc(temp,1)) == (char huge *) NULL) {
  149.         graderror(4,15);
  150.     }
  151.     if (dosread(fn,ptr->fontaddr,temp) != temp) {
  152.         graderror(4,14);
  153.     }
  154.     dosclose(fn);
  155. }
  156.  
  157. int RemvFont(fontn)
  158. int fontn;
  159. {   
  160.     register struct FONTABLE *ptr;
  161.  
  162.     if ((ptr=&FONTTAB[fontn])->status == NOT_USED) return(ERROR);
  163.     if (ptr -> status == PERMANENT) return(OK);
  164.     if (CURFONT==fontn) CURFONT=0;
  165.     hfree(ptr->chinfo);
  166.     hfree(ptr->fontaddr);
  167.     ptr->status = NOT_USED;
  168.     return(OK);
  169. }
  170.  
  171.